博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
celery异步发送邮件
阅读量:5891 次
发布时间:2019-06-19

本文共 2578 字,大约阅读时间需要 8 分钟。

利用Django框架发送邮件的详细过程,在前两天的博客中有所记录,但是单纯的那样发邮件是有非常大的问题的,这就需要celery异步发送来解决

 

首先我们来看一下邮件发送的过程:

  • Django网站先发送到smtp服务器
  • smtp服务器再把邮件发送到目的邮箱

这里有两个不确定时间:

  • Django网站----->smtp服务器
  • smtp服务器----->目的邮箱

这样的情况下,假定Django网站发送邮件到smtp耗时是5s,那么用户在表单中输入信息之后提交,页面需要刷新5s才会跳转。显然,这是我们非常不愿意看见的情况,极大的影响了用户体验。

利用celery异步发送邮件:

  • 过程图解:这里我的所有程序都是在一台电脑上

  • 首先在项目虚拟环境里安装celery模块: 

    • pip install celery
    • 如果你用的是win10操作系统运行celery 4.x版本可能会有问题,需要安装另外一个模块:pip install eventlet
    • 如果win10不进行上一步可能会出现问题,参考博客:  
  • 然后在Django项目里新建一个python package,名字叫做celery_tasks,里面创建一个python文件tasks.py

    • 首先确保你的电脑上已经安装有Redis数据库
    • 在项目的虚拟环境中还需要 pip install redis
    • 在tasks.py中的代码如下:其中第8-11行,是在使用不同的电脑运行celery的发起者、中间人、中间人时所需要用到的,这里我都是在一台电脑上运行,所以完全可以不写
      1 # 使用celery 2 import time 3 from celery import Celery 4 from django.conf import settings 5 from django.core.mail import send_mail 6  7 # 在任务处理者一端加这几句,如果使用的不是同一台电脑,django环境的初始化,一般启动项目的一端不需要加 8 import os 9 import django10 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')11 django.setup()12 13 # 创建一个Celery类的实例对象14 app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/9')15 16 # 定义任务函数17 @app.task()18 def send_register_active_mail(to_mail, username, token):19     """发送激活邮件"""20     # 组织邮件信息21     subject = '天天生鲜欢迎信息'22     message = ''23     sender = settings.EMAIL_FROM24     receiver = [to_mail,]25     html_message = '

      {},欢迎您成为天天生鲜注册会员

      请点击下面链接激活您的用户
      http:127.0.0.1:8000/user/active/{}'.format(26 username, token, token)27 send_mail(subject, message, sender, receiver, html_message=html_message)28 # 利用time模块模拟发了五秒钟邮件,原方法会页面加载5秒29 time.sleep(5)
    • 修改原先视图函数里发送邮件的部分,修改的部分如下,原先发送邮件的代码被我们封装到了tasks.py文件中的send_register_active_mail函数中
      1 # 导入上述创建的tasks.py文件中的异步发送邮件的方法 2 from celery_tasks.tasks import send_register_active_mail 3  4 # 发邮件 5 # subject = '天天生鲜欢迎信息' 6 # message = '' 7 # sender = settings.EMAIL_FROM 8 # receiver = [email] 9 # html_message =  '

      {},欢迎您成为天天生鲜注册会员

      请点击下面链接激活您的用户
      http:127.0.0.1:8000/user/active/{}'.format(username, token, token)10 # send_mail(subject, message, sender, receiver, html_message=html_message)11 # 上面注释掉了原先发送邮件的代码,现在用刚导入的函数所替代12 send_register_active_mail.delay(email, username, token)
  • 现在环境和代码都已经完成了,接下来在终端运行命

    • celery -A celery_tasks.tasks worker -l info -P eventlet

    • 其中 -P enentlet 是为了防止 win10 运行出错而附加的
    • 这样我们就启动了任务处理者
    • 如果任务处理者和redis都在另一台计算机上,就需要把项目和环境拷贝过去,然后也是同样的命令启动,不过在不同的计算机上就一定不能少了tasks.py中的8-11行的内容,因为tasks.py文件中的操作用到了Django项目中的一些配置
  • 此时,在进行注册操作,虽然我们用 time.sleep函数模拟了邮件发送5s,但是当提交表单的时候发送邮件的操作已经是去异步处理了,页面几乎是没有太多延迟进行了刷新,这里就不再演示了,以下是在进行注册操作时,终端打印的信息

    • 最下面两行就是先接收到了发送邮件的请求,然后又执行发送的过程

 

转载于:https://www.cnblogs.com/springionic/p/10959353.html

你可能感兴趣的文章
工控随笔_12_西门子_WinCC的VBS脚本_03_变量类型
查看>>
使用ASP.NET Atlas SortBehavior实现客户端排序
查看>>
图像滤镜处理算法:灰度、黑白、底片、浮雕
查看>>
Office文档出错的几种原因与解决方法
查看>>
正则表达式 学习笔记1.1
查看>>
AssetBundle进阶内存优化(Unity 4.x)
查看>>
《从零开始学Swift》学习笔记(Day 40)——析构函数
查看>>
Exchange2003-2010迁移系列之十,Exchange证书攻略
查看>>
extmail集群的邮件负载均衡方案 [lvs dns postfix]
查看>>
更改UIView的背景
查看>>
Prometheus安装部署以及配置
查看>>
Web开发之-DOM操作对象
查看>>
APUE第15章学习扎记之程序的存储区布局试验
查看>>
ubuntu升级16.04 inter idea 中文输入法无效
查看>>
三目运算判断jsp脚本里面的值
查看>>
sshtunnel在本地访问云服务器mysql
查看>>
小蚂蚁学习APP接口开发(1)—— json方式封装通信接口
查看>>
我的友情链接
查看>>
CDN相关
查看>>
Tomcat的设置4——Tomcat的体系结构与设置基于端口号的虚拟主机
查看>>